<?php

/**
 * REST 웹서비스를 이용하는 템플릿 형태의 서비스
 * 
 * @since 11. 5. 9 오후 2:43
 */
class RestService {

    var $ch;
    //var $headers;
    var $url;
    var $body;
    
    /**
     * 생성자
     * 
     * @param string $url 리소스 uri
     */
    public function RestService($url = null) {
        if (is_null($url)) {
            wp_die('리소스URL누락');
        }
        $this->url = $url;
        $this->ch = curl_init();
        //$this->headers = array();
    }
    
    /**
     * 리소스 GET
     * 
     * @param string $type 리소스 응답 형태
     * @return array 리소스 정보 배열 
     */
    public function get($type = 'xml') {
        $headers = array();
        $headers[] = 'Accept: application/' . $type;

        curl_setopt_array($this->ch, array(
            CURLOPT_URL => $this->url
            , CURLOPT_HTTPHEADER => $headers
            , CURLOPT_HEADER => false
            , CURLOPT_HTTPGET => true
            , CURLOPT_RETURNTRANSFER => true
        ));

        $content = curl_exec($this->ch);

        curl_close($this->ch);

        switch ($type) {
            case 'xml':
                $content = $this->filter_cdata($content);
                return $this->xml_to_array($content);
            case 'json':
                return json_decode($content);
        }
    }
    
    /**
     * 리소스 POST
     */
    public function post() {
        
    }
    
    /**
     * 리소스 PUT
     */
    public function put() {
        
    }
    
    /**
     * 리소스 DELETE
     */
    public function delete() {
        
    }
    
    /**
     * XML 문자열에서 <![CDATA[ ]]> 부분을 필터링한다.
     * 
     * @param string $xml 입력 XML
     * @return string XML
     */
    private function filter_cdata($xml){
        $xml = preg_replace('/<!\[CDATA\[/', '',$xml);
        $xml = preg_replace('/\]\]>/', '',$xml);
        return $xml;
    }
    
    /**
     * XML을 배열로 변환하며 반환한다.
     * 
     * @param string $xml 입력 XML
     * @param boolean $recursive 재귀여부(함수내부적으로만 사용한다.)
     * @return array 배열 
     */
    public function xml_to_array($xml, $recursive = false) {
        
        if (!$recursive) {
            $array = simplexml_load_string($xml);
        } else {
            $array = $xml;
        }
        
        $newArray = array();

        foreach ($array as $key => $value) {
            $value = (array) $value;

            if (isset($value[0])) {
                $newArray[$key] = trim($value[0]);
            } else {
                $newArray[$key][] = $this->xml_to_array($value, true);
            }
        }
        return $newArray;
    }
    
    public function get_headers() {
        return $this->headers;
    }

    public function set_headers($headers) {
        $this->headers = $headers;
    }

    public function get_url() {
        return $this->url;
    }

    public function set_url($url) {
        $this->url = $url;
    }

    public function get_body() {
        return $this->body;
    }

    public function set_body($body) {
        $this->body = $body;
    }

}

?>
